import java.io.IOException;

/**
 * Beschreiben Sie hier die Klasse SteuerServer.
 * 
 * @author christoph.stueber@mes-alsfeld.de
 * @version Schuljahr 2013/2014
 *          erstellt 15.03.2014
 *          geändert 16.03.2014
 */
public class SteuerServer implements Runnable
{
    /** */
    private int port;

    /** */
    private ServerSocket server;

    /** */
    private boolean running = false;

    /** */
    private Steuerung eineSteuerung = new Steuerung();

    /** @param port int */
    public SteuerServer(int port)
    {
        this.port = port;
    }

    /**
     * 
     */
    public void starteServer()
    {
        try
        {
            server = new ServerSocket(port);
            System.out.println("Sicherheitssystem gestartet. Port " + port);
        } catch (IOException e)
        {
            System.err.println("Horchen nicht moeglich an port: " + port);
            System.exit(1);
        }
        running = true;
        java.lang.Thread t = new java.lang.Thread(this);
        t.start();
    }

    /**
     * @param client
     */
    public void sendeWkaReport(Socket client)
    {
        Date datum = new Date();
        String s = "\n******** Windpark-Report vom " + datum.getDate() + " um "
                + datum.getTime() + " Uhr *****\n";
        for (Ereignis e : eineSteuerung.getEreignisse())
        {
            s += "\n" + datum.getDate() + " um " + datum.getTime();
            s += " Windstufe: " + e.getWindstufe();
            s += "\nLaufend WKAs: Nr. ";
            int status = e.getWkaStatus();
            for (int i = 0; i < Steuerung.WKAZAHL; i++)
            {
                if ((status & (1 << i)) > 0)
                {
                    s += (i + 1) + " ";
                }
            }

            if (e instanceof Stoerung)
            {
                Stoerung err = (Stoerung) e;
                s += "\nStoerung der WKA " + err.getWKA().getWkaNr() + "!";
            }
        }
        s += "\n\nZurzeit gesperrte WKAs: Nr ";
        for (WKA w : eineSteuerung.getWindkraftanlagen())
        {
            if (w.istGesperrt())
            {
                s += w.getWkaNr() + " ";
            }
        }
        //System.out.println("+++ " + s);
        try
        {
            client.write(s);
            //client.close();
        } catch (IOException ex)
        {
            System.err.println("IOException: " + ex.getMessage());
        }
        eineSteuerung.getEreignisse().clear();
    }

    /**
     * run-Methode des Threads.
     */
    public void run()
    {
        Socket client = null;
        while (running)
        {
            System.out.println("+++ warte auf eingehende Verbindung");
            try
            {
                client = server.accept();
            } catch (IOException e)
            {
                System.err.println("Verbindung fehlgeschlagen.");
                System.exit(2);
            }

            // ... Client-SingleUserServerKonsole Dialog
            try
            {
                String eingabe = " ";
                System.out.println("+++ Server bereit zum Empfang");
                while (!eingabe.startsWith("quit"))
                {
                    sendeWkaReport(client);
                    eingabe = client.readLine();
                }

            } catch (IOException e)
            {
                System.err.println("IO-Fehler " + e.getMessage());
            }
        }
        try
        {
            client.close();
            server.close();
        } catch (IOException e)
        {
            System.err.println("Fehler beim Herunterfahren " + e.getMessage());
        }
    }

    /**
     * 
     */
    public void beenden()
    {
        running = false;
    }

}
